// npm install -g express@4.18.2 http-proxy-middleware@2.0.6
const express = require('express');
const {createProxyMiddleware: http_proxy} = require('http-proxy-middleware'); // 代理 往上
const net = require('net');
const path = require('path');
const app = express();

/**
 * 检测端口是否被占用
 * @param port
 * @param callback
 */
function isPortInUse(port, callback) {
  const server = net.createServer().listen(port);
  server.on('listening', function () {
    // 端口未被占用，关闭服务器并调用回调函数
    server.close();
    callback(false);
  });

  server.on('error', function (err) {
    // 如果端口已经被占用，则会触发 'error' 事件，并且 err.code === 'EADDRINUSE'
    if (err.code === 'EADDRINUSE') {
      callback(true);
    } else {
      // 非端口占用错误，可能需要处理其他类型的错误
      callback(new Error(`未知错误: ${err}`));
    }
  });
}


const dir = '/BrowseVueLoaderTest' // 当前文件路径的相对路径
// 端口
let port = 4444
// 配置代理
const proxy = {
  // '/jdz-api': {
  //     target: 'http://192.168.2.102:9090'
  // },
  // '/cgmedia': {
  // target: 'http://192.168.2.102:9090'
  // router: (req) => { // 这个会覆盖target成为新的target
  //   return url
  // },
  // secure: false,      //就是这个配置，能够接收无效证书的https
  // changeOrigin: true, // 修改请求原
  // ws: true, // 开启WebSocket代理
  // pathRewrite: {'^/cgmedia': 'cgmedia'}
  // pathRewrite:(path, req)=>{
  //     console.log(path,req)
  // },
  // },
};

let WebSocket_upgrade = []
for (let key in proxy) { // 添加代理
  let a = http_proxy(key, proxy[key])
  if (a.upgrade) {
    WebSocket_upgrade.push(a.upgrade)
  }
  app.use(a);
}
app.use(express.static(path.join(__dirname, dir)));
const os = require("os");

//获取本机ip
function getIpAddress() {
  /**os.networkInterfaces() 返回一个对象，该对象包含已分配了网络地址的网络接口 */
  const interfaces = os.networkInterfaces();
  Object.values(interfaces)
    .forEach(i => {
      i.forEach(j => {
        if (j.family === 'IPv4') {
          console.log('http://' + j.address + ':' + port);
        }
      })
    })
}

function runServer() {
  let server = app.listen(port, function () {
    getIpAddress()
  });
  server.on('upgrade', function (req, socket, head) {
    WebSocket_upgrade.forEach(item => {
      item(req, socket, head)
    })
  });  // <-- subscribe to http 'upgrade'
}

function checkPortWithRunServer() {
  isPortInUse(port, (inUse) => {
    if (inUse) {
      console.log('端口 ' + port + ' 正在被占用');
      port++
      checkPortWithRunServer()
    } else {
      console.log('端口 ' + port + ' 可以使用');
      runServer()
    }
  })
}

checkPortWithRunServer()
